【数据结构】图的遍历--广度优先搜索

广度优先搜索过程类似于树的层次遍历,假设从图中某顶点i出发,在访问i之后依次访问i的各个未被访问的邻接点,然后从这些邻接点出发依次访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到所有顶点都被访问到(限于连通图)。如果是非连通图,则从未被访问的顶点中任选一个,再次重复上述过程。
换句话说,广度优先搜索过程中其实是以顶点i为起始点,由近及远,依次访问了与i路径相通且路径长度为1,2,··· ···的顶点。
根据广度优先搜索的特点,可以使用队列来保证访问的次序。每访问一个顶点就将该顶点入队,之后从队首取出一个顶点,依次访问该顶点未被访问过的邻接点,并入队。重复该过程,直到队列为空,则一个连通分量的遍历完成。

    以该无向图为例,以A为起点,字母序访问邻接点,其广度优先搜索结果为:
                         A B C D F H E G I

下面给出邻接矩阵存储图的广度优先搜索算法的代码描述。

void BFS_M(MGraph G)
{
    Queue Q;
    int t;
    Q = CreateQ();
    for(int i = 0; i < G->n; i++)
        G->Visited[i] = 0;
    for(int i = 0; i < G->n; i++){
        if(!G->Visited[i]){
            printf("%c ", G->Vertices[i]);
            G->Visited[i] = 1;
            AddQ(Q,i);
            while(!IsEmptyQ(Q)){
                t = DeleteQ(Q);
                for(int j = 0; j < G->n; j++)
                if(G->Edges[t][j] != INFINITY && !G->Visited[j]){
                    printf("%c ", G->Vertices[j]);
                    G->Visited[j] = 1;
                    AddQ(Q,j);
                }
            }
        }
        printf("\n");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值